package com.example.netty.channelHandler优化;

import com.example.netty.encode.Packet.PackerCode;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @desciption
 * Q1:之前每一次接受到数据之后，首先都会吧二进制对象转成bytebuf对象，然后进行解码成java对象，特别麻烦
 * Q2:由于byteBuf对象使用的是堆外内存，JVM无法回收，但是这个ByteToMessageDecoder已经内部进行回收操作，我们不需要手动回收！
 * @author liupk
 * @date 2018/11/7
 */
public class PacketDecoder extends ByteToMessageDecoder {
    
    
    /**
     *
     * @date 2018/11/7
     * @param ctx 上下文对象,
     * @param in  ByteBuf对象 无需强转object对象了
     * @param out 往list添加对象，会自动往下一个handle传递参数
     * @return
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        out.add(PackerCode.getINSTANCE().decode(in));
    }
}